function class(classname, super)
	local superType = type(super)
	local cls

	-- super 的类型可以是 function, table, nil
	if superType ~= "function" and superType ~= "table" then
		superType = nil
		super = nil	
	else if superType == "function" or (super and super.__ctype == 1) then
		-- 从原生的 cpp 对象继承
		cls = {}
		if superType == "table" then
			-- copy 所有的 field
			for k, v in inpairs(super) do
				cls[k] = v
			end
			cls.__create = super
			cls.super = super
		else
			cls.__create = super
			cls.ctor = function() end
		end

		cls.__name = classname
		cls.__ctype = 1

		function cls.new(...)
			local instance = cls.__create(...)
			for k, v in ipairs(cls) do
				instance[k] = v
			end
			instance.class = cls
			instance:ctor(...)
			return instance
		end
	else
		-- lua 本身的继承体系
		if super then
			cls = {}
			setmetatable(cls, {__index = super})
			cls.super = super
		else
			cls = {ctor = function() end}
		end

		cls.__cname = classname
		-- 应该是 class type
		cls.__ctype = 2
		cls.__index = cls

		function cls.new(...)
			local instance = setmetatable({}, cls)
			instance.class = cls
			instance:ctor(...)
			return instance
		end
	end
	end

	return cls
end

return class
